package edu.upc.inmobiliaria.repository.jdbc;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

import edu.upc.inmobiliaria.domain.EstadoInmuebleBean;
import edu.upc.inmobiliaria.domain.InmuebleBean;
import edu.upc.inmobiliaria.domain.TipoInmueble;
import edu.upc.inmobiliaria.domain.TipoOperacionBean;
import edu.upc.inmobiliaria.domain.UbigeoBean;
import edu.upc.inmobiliaria.domain.utils.EstadoInmuebleConstants;
import edu.upc.inmobiliaria.domain.utils.TipoOperacionConstants;
import edu.upc.inmobiliaria.repository.EstadoInmuebleRepository;
import edu.upc.inmobiliaria.repository.InmuebleRepository;
import edu.upc.inmobiliaria.repository.TipoInmuebleRepository;
import edu.upc.inmobiliaria.repository.TipoOperacionRepository;
import edu.upc.inmobiliaria.repository.UbigeoRepository;

@Repository
public class JdbcInmuebleRepository implements InmuebleRepository {

	private SimpleJdbcTemplate simpleJdbcTemplate;
	String sqlestatusinmueble = "UPDATE T_INMUEBLE SET IDESTADOINMUEBLE=?,IDTIPOOPERACION=? WHERE ID=?";
	@Autowired
	TipoInmuebleRepository rti;
	@Autowired
	TipoOperacionRepository rto;
	@Autowired
	EstadoInmuebleRepository rei;
	@Autowired
	UbigeoRepository rub;

	@Autowired
	public JdbcInmuebleRepository(DataSource dataSource) {
		this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}

	@Override
	public boolean registrar(InmuebleBean inmueble, String usuario,
			int nrohabitaciones, int nrobanos, double atotal,
			double aconstruida, boolean cochera, boolean piscina) {
		try {
			String sql = "INSERT INTO T_INMUEBLE (ID,TELEFONO,DIMENSIONES,PRECIO,DESTACADO,CABLE,INTERNET,NROVISITAS,"
					+ "ANTIGUEDAD,IDTIPOINMUEBLE,IDTIPOOPERACION,IDESTADOINMUEBLE,IDUBIGEO,NROHABITACIONES,NROBANOS,ATOTAL,"
					+ "ACONSTRUIDA,COCHERA,PISCINA) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
			this.simpleJdbcTemplate.update(sql, inmueble.getId(),
					inmueble.getTelefono(), inmueble.getDimensiones(),
					inmueble.getPrecio(), inmueble.isDestacado(),
					inmueble.isCable(), inmueble.isInternet(),
					inmueble.getNrovisitas(), inmueble.getAntiguedad(),
					inmueble.getTipoi().getId(), inmueble.getTipop().getId(),
					inmueble.getEstado().getId(), inmueble.getUbigeo().getId(),
					nrohabitaciones, nrobanos, atotal, aconstruida, cochera,
					piscina);
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	@Override
	public boolean actualizar(InmuebleBean inmueble, String usuario,
			int nrohabitaciones, int nrobanos, double atotal,
			double aconstruida, boolean cochera, boolean piscina) {
		try {
			String sql = "UPDATE T_INMUEBLE SET TELEFONO=?,DIMENSIONES=?,PRECIO=?,DESTACADO=?,CABLE=?,"
					+ "INTERNET=?,NROVISITAS=?,ANTIGUEDAD=?,IDTIPOINMUEBLE=?,IDTIPOOPERACION=?,"
					+ "IDESTADOINMUEBLE=?,IDUBIGEO=?,NROHABITACIONES=?,NROBANOS=?,ATOTAL=?,"
					+ "ACONSTRUIDA=?,COCHERA=?,PISCINA=? WHERE ID=?";
			this.simpleJdbcTemplate.update(sql, 
					inmueble.getTelefono(), inmueble.getDimensiones(),
					inmueble.getPrecio(), inmueble.isDestacado(),
					inmueble.isCable(), inmueble.isInternet(),
					inmueble.getNrovisitas(), inmueble.getAntiguedad(),
					inmueble.getTipoi().getId(), inmueble.getTipop().getId(),
					inmueble.getEstado().getId(), inmueble.getUbigeo().getId(),
					nrohabitaciones, nrobanos, atotal, aconstruida, cochera,
					piscina,inmueble.getId());
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	@Override
	public boolean activarVenta(InmuebleBean inmueble, String usuario) {
		try {
			this.simpleJdbcTemplate.update(sqlestatusinmueble,
					EstadoInmuebleConstants.EI_ENVENTA,
					TipoOperacionConstants.TO_VENTA, inmueble.getId());
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	@Override
	public boolean desactivarVenta(InmuebleBean inmueble, String usuario) {
		try {
			this.simpleJdbcTemplate.update(sqlestatusinmueble,
					EstadoInmuebleConstants.EI_VENDIDO,
					TipoOperacionConstants.TO_VENTA, inmueble.getId());
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	@Override
	public boolean desactivarAlquiler(InmuebleBean inmueble, String usuario) {
		try {
			this.simpleJdbcTemplate.update(sqlestatusinmueble,
					EstadoInmuebleConstants.EI_ALQUILADO,
					TipoOperacionConstants.TO_ALQUILER, inmueble.getId());
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	@Override
	public boolean activarAlquiler(InmuebleBean inmueble, String usuario) {
		try {
			this.simpleJdbcTemplate.update(sqlestatusinmueble,
					EstadoInmuebleConstants.EI_ENALQUILER,
					TipoOperacionConstants.TO_ALQUILER, inmueble.getId());
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	@Override
	public boolean activarInmueble(InmuebleBean inmueble, String usuario) {
		try {
			this.simpleJdbcTemplate.update(sqlestatusinmueble,
					EstadoInmuebleConstants.EI_ENVENTA,
					TipoOperacionConstants.TO_VENTA, inmueble.getId());
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	@Override
	public boolean desactivarInmueble(InmuebleBean inmueble, String usuario) {
		try {
			this.simpleJdbcTemplate.update(sqlestatusinmueble,
					EstadoInmuebleConstants.EI_ANULADO,
					TipoOperacionConstants.TO_VENTA, inmueble.getId());
		} catch (DataAccessException e) {
			return false;
		}
		return true;
	}

	@Override
	public InmuebleBean buscar(String criterio) {
		InmuebleBean tipoinmueble = null;
		try {
			String sql = "SELECT ID,TELEFONO,DIMENSIONES,PRECIO,DESTACADO,CABLE,INTERNET,NROVISITAS,"
					+ "ANTIGUEDAD,IDTIPOINMUEBLE,IDTIPOOPERACION,IDESTADOINMUEBLE,IDUBIGEO,NROHABITACIONES,"
					+ "NROBANOS,ATOTAL,ACONSTRUIDA,COCHERA,PISCINA FROM T_INMUEBLE WHERE ID=?";
			RowMapper<InmuebleBean> mapper = new RowMapper<InmuebleBean>() {
				public InmuebleBean mapRow(ResultSet rs, int rowNum)
						throws SQLException {
					int id = rs.getInt("ID");
					String telefono = rs.getString("TELEFONO");
					double dimensiones = rs.getDouble("DIMENSIONES");
					double precio = rs.getDouble("PRECIO");
					boolean destacado = rs.getBoolean("DESTACADO");
					boolean cable = rs.getBoolean("CABLE");
					boolean internet = rs.getBoolean("INTERNET");
					int nrovisitas = rs.getInt("NROVISITAS");
					int antiguedad = rs.getInt("ANTIGUEDAD");
					int idtipoinmueble = rs.getInt("IDTIPOINMUEBLE");
					int idtipooperacion = rs.getInt("IDTIPOOPERACION");
					int idestadoinmueble = rs.getInt("IDESTADOINMUEBLE");
					int idubigeo = rs.getInt("IDUBIGEO");
					int nrohabitaciones = rs.getInt("NROHABITACIONES");
					int nrobanos = rs.getInt("NROBANOS");
					double atotal = rs.getDouble("ATOTAL");
					double aconstruida = rs.getDouble("ACONSTRUIDA");
					boolean cochera = rs.getBoolean("COCHERA");
					boolean piscina = rs.getBoolean("PISCINA");

					TipoInmueble ti = getTipoInmueble(idtipoinmueble);
					TipoOperacionBean to = getTipoOperacion(idtipooperacion);
					EstadoInmuebleBean ei = getEstadoInmueble(idestadoinmueble);
					UbigeoBean ub = getUbigeo(idubigeo);

					InmuebleBean inmueble = InmuebleBean.crearInmueble(id,
							telefono, dimensiones, precio, destacado, cable,
							internet, nrovisitas, antiguedad, ti, to, ei, ub,
							nrohabitaciones, nrobanos, atotal, aconstruida,
							cochera, piscina);
					return inmueble;
				}
			};

			tipoinmueble = this.simpleJdbcTemplate.queryForObject(sql, mapper,
					new Integer(criterio));
		} catch (EmptyResultDataAccessException ex) {
			return null;
		}
		return tipoinmueble;
	}

	@Override
	public InmuebleBean buscarPorcriterios(int id,int idubigeo) {
		InmuebleBean tipoinmueble = null;
		try {
			String sql = "SELECT ID,TELEFONO,DIMENSIONES,PRECIO,DESTACADO,CABLE,INTERNET,NROVISITAS,"
					+ "ANTIGUEDAD,IDTIPOINMUEBLE,IDTIPOOPERACION,IDESTADOINMUEBLE,IDUBIGEO,NROHABITACIONES,"
					+ "NROBANOS,ATOTAL,ACONSTRUIDA,COCHERA,PISCINA FROM T_INMUEBLE WHERE ID=? AND IDUBIGEO=?";
			RowMapper<InmuebleBean> mapper = new RowMapper<InmuebleBean>() {
				public InmuebleBean mapRow(ResultSet rs, int rowNum)
						throws SQLException {
					int id = rs.getInt("ID");
					String telefono = rs.getString("TELEFONO");
					double dimensiones = rs.getDouble("DIMENSIONES");
					double precio = rs.getDouble("PRECIO");
					boolean destacado = rs.getBoolean("DESTACADO");
					boolean cable = rs.getBoolean("CABLE");
					boolean internet = rs.getBoolean("INTERNET");
					int nrovisitas = rs.getInt("NROVISITAS");
					int antiguedad = rs.getInt("ANTIGUEDAD");
					int idtipoinmueble = rs.getInt("IDTIPOINMUEBLE");
					int idtipooperacion = rs.getInt("IDTIPOOPERACION");
					int idestadoinmueble = rs.getInt("IDESTADOINMUEBLE");
					int idubigeo = rs.getInt("IDUBIGEO");
					int nrohabitaciones = rs.getInt("NROHABITACIONES");
					int nrobanos = rs.getInt("NROBANOS");
					double atotal = rs.getDouble("ATOTAL");
					double aconstruida = rs.getDouble("ACONSTRUIDA");
					boolean cochera = rs.getBoolean("COCHERA");
					boolean piscina = rs.getBoolean("PISCINA");

					TipoInmueble ti = getTipoInmueble(idtipoinmueble);
					TipoOperacionBean to = getTipoOperacion(idtipooperacion);
					EstadoInmuebleBean ei = getEstadoInmueble(idestadoinmueble);
					UbigeoBean ub = getUbigeo(idubigeo);

					InmuebleBean inmueble = InmuebleBean.crearInmueble(id,
							telefono, dimensiones, precio, destacado, cable,
							internet, nrovisitas, antiguedad, ti, to, ei, ub,
							nrohabitaciones, nrobanos, atotal, aconstruida,
							cochera, piscina);
					return inmueble;
				}
			};

			tipoinmueble = this.simpleJdbcTemplate.queryForObject(sql, mapper, id, idubigeo);
		} catch (EmptyResultDataAccessException ex) {
			return null;
		}
		return tipoinmueble;	
	}
	
	@Override
	public List<InmuebleBean> mostrarMasDestacados() {
		List<InmuebleBean> inmueble = null;
		try {
			String sql = "SELECT ID,TELEFONO,DIMENSIONES,PRECIO,DESTACADO,CABLE,INTERNET,NROVISITAS,"
					+ "ANTIGUEDAD,IDTIPOINMUEBLE,IDTIPOOPERACION,IDESTADOINMUEBLE,IDUBIGEO,NROHABITACIONES,"
					+ "NROBANOS,ATOTAL,ACONSTRUIDA,COCHERA,PISCINA FROM T_INMUEBLE WHERE DESTACADO=?";
			RowMapper<InmuebleBean> mapper = new RowMapper<InmuebleBean>() {
				public InmuebleBean mapRow(ResultSet rs, int rowNum)
						throws SQLException {
					int id = rs.getInt("ID");
					String telefono = rs.getString("TELEFONO");
					double dimensiones = rs.getDouble("DIMENSIONES");
					double precio = rs.getDouble("PRECIO");
					boolean destacado = rs.getBoolean("DESTACADO");
					boolean cable = rs.getBoolean("CABLE");
					boolean internet = rs.getBoolean("INTERNET");
					int nrovisitas = rs.getInt("NROVISITAS");
					int antiguedad = rs.getInt("ANTIGUEDAD");
					int idtipoinmueble = rs.getInt("IDTIPOINMUEBLE");
					int idtipooperacion = rs.getInt("IDTIPOOPERACION");
					int idestadoinmueble = rs.getInt("IDESTADOINMUEBLE");
					int idubigeo = rs.getInt("IDUBIGEO");
					int nrohabitaciones = rs.getInt("NROHABITACIONES");
					int nrobanos = rs.getInt("NROBANOS");
					double atotal = rs.getDouble("ATOTAL");
					double aconstruida = rs.getDouble("ACONSTRUIDA");
					boolean cochera = rs.getBoolean("COCHERA");
					boolean piscina = rs.getBoolean("PISCINA");

					TipoInmueble ti = getTipoInmueble(idtipoinmueble);
					TipoOperacionBean to = getTipoOperacion(idtipooperacion);
					EstadoInmuebleBean ei = getEstadoInmueble(idestadoinmueble);
					UbigeoBean ub = getUbigeo(idubigeo);

					InmuebleBean inmueble = InmuebleBean.crearInmueble(id,
							telefono, dimensiones, precio, destacado, cable,
							internet, nrovisitas, antiguedad, ti, to, ei, ub,
							nrohabitaciones, nrobanos, atotal, aconstruida,
							cochera, piscina);
					return inmueble;
				}
			};

			inmueble = this.simpleJdbcTemplate.query(sql, mapper, true);
		} catch (EmptyResultDataAccessException ex) {
			return null;
		}
		return inmueble;
	}

	public TipoInmueble getTipoInmueble(int id) {
		return rti.getTipoInmueble(id);
	}

	public TipoOperacionBean getTipoOperacion(int id) {
		return rto.getTipooperacion(id);
	}

	public EstadoInmuebleBean getEstadoInmueble(int id) {
		return rei.getEstadoInmueble(id);
	}

	public UbigeoBean getUbigeo(int id) {
		return rub.getUbigeo(id);
	}
}
